import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 案例：
 * * 需求：写一个"框架"，不能改变该类的任何代码的前提下，可以帮我们创建任意类的对象，并且执行其中任意方法
 * * 实现：
 * 1. 注解
 * 2. 反射
 * * 步骤：
 * 1. 将需要创建的对象的全类名和需要执行的方法定义在注解中
 * 2. 在程序中解析注解的属性值
 * 3. 使用反射技术来加载类文件进内存，创建Class对象
 * 4. 通过Class对象创建对象
 * 5. 执行方法
 */

//使用注解，并为注解中的属性赋值
@Prop(className = "domain.Person",methodName = "eat")
public class ReflectTest_UseAnnotation {
    public static void main(String[] args) {
        try {
            //1.获取注解定义的位置的对象（Class,Method,Field），此处应该获取Class对象
            Class<ReflectTest_UseAnnotation> classObj = ReflectTest_UseAnnotation.class;
            //2.获取指定的注解对象
            Prop annotation = classObj.getAnnotation(Prop.class);
            //3.调用注解对象中定义的抽象方法，获取返回值
            String className = annotation.className();
            String methodName = annotation.methodName();
            //4.加载该类进内存，创建Class对象
            Class cls = Class.forName(className);
            //5.创建对象
            Object o = cls.newInstance();
            //6.获取方法对象
            Method method = cls.getMethod(methodName);
            //7.执行方法
            method.invoke(o);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}